package controllers;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import models.Jogador;
import play.mvc.Before;
import play.mvc.Controller;
import controllers.pojo.Gerenciador;
import controllers.pojo.Partida;
import controllers.pojo.PartidaDTO;

public class Panel extends Controller {

	static public int partidasCount = 0;
	static public final int AUSENTE = -1;
	static public ConcurrentHashMap<Integer, Gerenciador> partidasAtivas = new ConcurrentHashMap<Integer, Gerenciador>();
	static public ConcurrentHashMap<Integer, Gerenciador> partidasEmEspera = new ConcurrentHashMap<Integer, Gerenciador>();

	@Before
	static public void autenticado() {
		// TODO excecao de autenticao para mobile
		if (params._contains("email")) {
			Jogador jogador = Jogador.find("email = ? and senha = ?",
					params.get("email"), params.get("senha")).first();
			if (jogador != null) {
				session.put("user", jogador.id);
				if (params._contains("mobile")){
					session.put("mobile", "mobile");
				}
			}
		}

		if (session.get("user") == null) {
			Application.index();
		}
	}

	static public void index() {
		Jogador jogadorLogado = Jogador.find("byId",
				Long.parseLong(session.get("user"))).first();

		render(jogadorLogado);
	}
	
	static public void mobile(){
		Jogador jogadorLogado = Jogador.find("byId",
				Long.parseLong(session.get("user"))).first();
		render(jogadorLogado);
	}
	
	static public void partidasmobile(){
		Jogador jogadorLogado = Jogador.find("byId",
				Long.parseLong(session.get("user"))).first();
		render(jogadorLogado);
	}
	
	static public void rankingmobile(){
		Jogador jogadorLogado = Jogador.find("byId",
				Long.parseLong(session.get("user"))).first();
		render(jogadorLogado);
	}

	static public void partida(int id) {

		Jogador jogadorLogado = Jogador.find("byId",
				Long.parseLong(session.get("user"))).first();

		id = params._contains("id") ? Integer.parseInt(params.get("id"))
				: AUSENTE;

		if (request.method.equalsIgnoreCase("post")) {
			int altura = Integer.parseInt(params.get("altura"));
			int largura = Integer.parseInt(params.get("largura"));

			if (id == AUSENTE) {
				Jogador jogador1 = Jogador.find("byId",
						Long.parseLong(session.get("user"))).first();

				partidasEmEspera.put(partidasCount, new Gerenciador(
						partidasCount, new Partida(altura+1, largura+1), jogador1,
						null));

				partidasCount++;
				partida(partidasCount - 1);
			} else {
				jogada(id, altura, largura);
			}
		} else {
			if (id != AUSENTE) {
				Gerenciador partida = partidasAtivas.containsKey(id) ? partidasAtivas
						.get(id) : partidasEmEspera.get(id);

				if (partida.jogadores.get(1) == null
						&& !jogadorLogado.equals(partida.jogadores.get(0))) {
					partida.jogadores.set(1, jogadorLogado);
					partida.jogoAtivo = true;

					partidasAtivas.put(partida.idGerenciador,
							partidasEmEspera.remove(partida.idGerenciador));
				}

				if (request.format.equalsIgnoreCase("json")) {
					renderJSON(partida.toDTO());
				} else {
					if (session.contains("mobile"))
						renderTemplate("/Panel/partidamobile.html",partida.toDTO(), jogadorLogado);
					else
						render(partida.toDTO(), jogadorLogado);
				}
			} else {
				List<PartidaDTO> partidas = new ArrayList<PartidaDTO>();

				for (Gerenciador partida : partidasEmEspera.values()) {
					partidas.add(partida.toDTO());
				}
				
				for (Gerenciador partida : partidasAtivas.values()) {
					partidas.add(partida.toDTO());
				}

				renderJSON(partidas);
			}
		}
	}

	static public void jogada(int id, int altura, int largura) {
		Gerenciador partida = partidasAtivas.get(id);
		Jogador jogadorLogado = Jogador.find("byId",
				Long.parseLong(session.get("user"))).first();
		partida.efetuarJogada(altura, largura, jogadorLogado);
		renderJSON(partida.toDTO());
	}
}